ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಬಳಸಿ ಸುಧಾರಿತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ತಂತ್ರಗಳನ್ನು ಅನ್ವೇಷಿಸಿ. ಹೆಚ್ಚು ದೃಢವಾದ, ನಿರ್ವಹಿಸಬಲ್ಲ ಮತ್ತು ನಿರೀಕ್ಷಿತ ಕೋಡ್ ಬರೆಯಿರಿ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್: ದೃಢವಾದ ಕೋಡ್ಗಾಗಿ ಸುಧಾರಿತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್, ಡೈನಾಮಿಕ್ ಆಗಿ ಟೈಪ್ ಆಗಿದ್ದರೂ, ಸ್ಟ್ಯಾಟಿಕ್ ವಿಶ್ಲೇಷಣೆ ಮತ್ತು ಕಂಪೈಲ್-ಟೈಮ್ ಪರಿಶೀಲನೆಗಳಿಂದ ಅಪಾರವಾಗಿ ಪ್ರಯೋಜನ ಪಡೆಯುತ್ತದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್, ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಒಂದು ಸೂಪರ್ಸೆಟ್, ಸ್ಟ್ಯಾಟಿಕ್ ಟೈಪಿಂಗ್ ಅನ್ನು ಪರಿಚಯಿಸುತ್ತದೆ ಮತ್ತು ಕೋಡ್ ಗುಣಮಟ್ಟವನ್ನು ಗಣನೀಯವಾಗಿ ಹೆಚ್ಚಿಸುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಸರಳ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಅಥವಾ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಟೈಪ್ ಸಿಸ್ಟಮ್ನೊಂದಿಗೆ ಸಹ, ನಾವು ಹೆಚ್ಚು ಸುಧಾರಿತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಸಾಧಿಸಲು ಮತ್ತು ಹೆಚ್ಚು ದೃಢವಾದ, ನಿರ್ವಹಿಸಬಲ್ಲ, ಮತ್ತು ನಿರೀಕ್ಷಿತ ಕೋಡ್ ಬರೆಯಲು ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ನಂತಹ ತಂತ್ರಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು. ಈ ಲೇಖನವು ಈ ಪ್ರಬಲ ಪರಿಕಲ್ಪನೆಗಳನ್ನು ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಅನ್ವೇಷಿಸುತ್ತದೆ.
ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು
ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಎಂದರೆ ಕಂಪೈಲರ್ (ಅಥವಾ ಇಂಟರ್ಪ್ರಿಟರ್) ನ ಸ್ಪಷ್ಟವಾದ ಟೈಪ್ ವಿವರಣೆಗಳಿಲ್ಲದೆ ಒಂದು ವೇರಿಯೇಬಲ್ ಅಥವಾ ಎಕ್ಸ್ಪ್ರೆಶನ್ನ ಟೈಪ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಣಯಿಸುವ ಸಾಮರ್ಥ್ಯ. ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್, ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ, ರನ್ಟೈಮ್ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಮೇಲೆ ಹೆಚ್ಚು ಅವಲಂಬಿತವಾಗಿದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್, ನಮ್ಮ ಕೋಡ್ ಅನ್ನು ರನ್ ಮಾಡುವ ಮೊದಲು ಟೈಪ್ ದೋಷಗಳನ್ನು ಹಿಡಿಯಲು ಅನುವು ಮಾಡಿಕೊಡುವ ಮೂಲಕ, ಕಂಪೈಲ್-ಟೈಮ್ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಒದಗಿಸುವ ಮೂಲಕ ಇದನ್ನು ಒಂದು ಹೆಜ್ಜೆ ಮುಂದೆ ತೆಗೆದುಕೊಂಡು ಹೋಗುತ್ತದೆ.
ಕೆಳಗಿನ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ (ಅಥವಾ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್) ಉದಾಹರಣೆಯನ್ನು ಪರಿಗಣಿಸಿ:
let x = 10; // ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ x ಅನ್ನು 'number' ಟೈಪ್ ಎಂದು ನಿರ್ಣಯಿಸುತ್ತದೆ
let y = "Hello"; // ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ y ಅನ್ನು 'string' ಟೈಪ್ ಎಂದು ನಿರ್ಣಯಿಸುತ್ತದೆ
function add(a: number, b: number) { // ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಸ್ಪಷ್ಟವಾದ ಟೈಪ್ ವಿವರಣೆಗಳು
return a + b;
}
let result = add(x, 5); // ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ result ಅನ್ನು 'number' ಟೈಪ್ ಎಂದು ನಿರ್ಣಯಿಸುತ್ತದೆ
// let error = add(x, y); // ಇದು ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ದೋಷವನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ
ಮೂಲಭೂತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಸಹಾಯಕವಾಗಿದ್ದರೂ, ಸಂಕೀರ್ಣ ಡೇಟಾ ರಚನೆಗಳು ಮತ್ತು ಷರತ್ತುಬದ್ಧ ತರ್ಕದೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ ಅದು ಸಾಮಾನ್ಯವಾಗಿ ಸಾಕಾಗುವುದಿಲ್ಲ. ಇಲ್ಲಿಯೇ ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಪ್ರವೇಶಿಸುತ್ತವೆ.
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್: ಆಲ್ಜೀಬ್ರಾಯಿಕ್ ಡೇಟಾ ಟೈಪ್ಗಳನ್ನು ಅನುಕರಿಸುವುದು
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್, ಸಾಮಾನ್ಯವಾಗಿ ಹ್ಯಾಸ್ಕೆಲ್, ಸ್ಕಾಲಾ, ಮತ್ತು ರಸ್ಟ್ನಂತಹ ಫಂಕ್ಷನಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಭಾಷೆಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತದೆ, ಇದು ಡೇಟಾವನ್ನು ವಿಭಜಿಸಲು ಮತ್ತು ಡೇಟಾದ ಆಕಾರ ಅಥವಾ ರಚನೆಯ ಆಧಾರದ ಮೇಲೆ ವಿಭಿನ್ನ ಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು ನಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಸ್ಥಳೀಯ ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಇಲ್ಲ, ಆದರೆ ನಾವು ತಂತ್ರಗಳ ಸಂಯೋಜನೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಅದನ್ನು ಅನುಕರಿಸಬಹುದು, ವಿಶೇಷವಾಗಿ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಿದಾಗ.
ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳು
ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ (ಟ್ಯಾಗ್ಡ್ ಯೂನಿಯನ್ ಅಥವಾ ವೇರಿಯಂಟ್ ಟೈಪ್ ಎಂದೂ ಕರೆಯಲ್ಪಡುತ್ತದೆ) ಎನ್ನುವುದು ಅನೇಕ ವಿಭಿನ್ನ ಟೈಪ್ಗಳಿಂದ ಕೂಡಿದ ಒಂದು ಟೈಪ್ ಆಗಿದೆ, ಪ್ರತಿಯೊಂದೂ ಅವುಗಳ ನಡುವೆ ವ್ಯತ್ಯಾಸವನ್ನು ಗುರುತಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುವ ಸಾಮಾನ್ಯ ಡಿಸ್ಕ್ರಿಮಿನೆಂಟ್ ಪ್ರಾಪರ್ಟಿ ("ಟ್ಯಾಗ್") ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಇದು ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಅನ್ನು ಅನುಕರಿಸಲು ಒಂದು ನಿರ್ಣಾಯಕ ನಿರ್ಮಾಣ ಬ್ಲಾಕ್ ಆಗಿದೆ.
ಒಂದು ಕಾರ್ಯಾಚರಣೆಯಿಂದ ಬರುವ ವಿವಿಧ ರೀತಿಯ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಉದಾಹರಣೆಯನ್ನು ಪರಿಗಣಿಸಿ:
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
type Success = { kind: "success"; value: T };
type Failure = { kind: "failure"; error: string };
type Result = Success | Failure;
function processData(data: string): Result {
if (data === "valid") {
return { kind: "success", value: 42 };
} else {
return { kind: "failure", error: "Invalid data" };
}
}
const result = processData("valid");
// ಈಗ, ನಾವು 'result' ವೇರಿಯೇಬಲ್ ಅನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುವುದು?
`Result
ಷರತ್ತುಬದ್ಧ ತರ್ಕದೊಂದಿಗೆ ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್
ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಎನ್ನುವುದು ಷರತ್ತುಬದ್ಧ ತರ್ಕ ಅಥವಾ ರನ್ಟೈಮ್ ಪರಿಶೀಲನೆಗಳ ಆಧಾರದ ಮೇಲೆ ವೇರಿಯೇಬಲ್ನ ಟೈಪ್ ಅನ್ನು ಸಂಸ್ಕರಿಸುವ ಪ್ರಕ್ರಿಯೆಯಾಗಿದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಟೈಪ್ ಚೆಕ್ಕರ್ ಷರತ್ತುಬದ್ಧ ಬ್ಲಾಕ್ಗಳ ಒಳಗೆ ಟೈಪ್ಗಳು ಹೇಗೆ ಬದಲಾಗುತ್ತವೆ ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನಿಯಂತ್ರಣ ಹರಿವಿನ ವಿಶ್ಲೇಷಣೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನಮ್ಮ ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ನ `kind` ಪ್ರಾಪರ್ಟಿಯ ಆಧಾರದ ಮೇಲೆ ಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು ನಾವು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು.
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
if (result.kind === "success") {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಈಗ 'result' 'Success' ಟೈಪ್ ಎಂದು ತಿಳಿದಿದೆ
console.log("Success! Value:", result.value); // ಇಲ್ಲಿ ಯಾವುದೇ ಟೈಪ್ ದೋಷಗಳಿಲ್ಲ
} else {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಈಗ 'result' 'Failure' ಟೈಪ್ ಎಂದು ತಿಳಿದಿದೆ
console.error("Failure! Error:", result.error);
}
`if` ಬ್ಲಾಕ್ನ ಒಳಗೆ, ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ `result` ಒಂದು `Success
ಸುಧಾರಿತ ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ತಂತ್ರಗಳು
ಸರಳ `if` ಸ್ಟೇಟ್ಮೆಂಟ್ಗಳ ಹೊರತಾಗಿ, ಟೈಪ್ಗಳನ್ನು ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಸಂಕುಚಿತಗೊಳಿಸಲು ನಾವು ಹಲವಾರು ಸುಧಾರಿತ ತಂತ್ರಗಳನ್ನು ಬಳಸಬಹುದು.
`typeof` ಮತ್ತು `instanceof` ಗಾರ್ಡ್ಗಳು
`typeof` ಮತ್ತು `instanceof` ಆಪರೇಟರ್ಗಳನ್ನು ರನ್ಟೈಮ್ ಪರಿಶೀಲನೆಗಳ ಆಧಾರದ ಮೇಲೆ ಟೈಪ್ಗಳನ್ನು ಸಂಸ್ಕರಿಸಲು ಬಳಸಬಹುದು.
function processValue(value: string | number) {
if (typeof value === "string") {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'value' ಒಂದು ಸ್ಟ್ರಿಂಗ್ ಎಂದು ತಿಳಿದಿದೆ
console.log("Value is a string:", value.toUpperCase());
} else {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'value' ಒಂದು ನಂಬರ್ ಎಂದು ತಿಳಿದಿದೆ
console.log("Value is a number:", value * 2);
}
}
processValue("hello");
processValue(10);
class MyClass {}
function processObject(obj: MyClass | string) {
if (obj instanceof MyClass) {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'obj' MyClass ನ ಒಂದು ಇನ್ಸ್ಟಾನ್ಸ್ ಎಂದು ತಿಳಿದಿದೆ
console.log("Object is an instance of MyClass");
} else {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'obj' ಒಂದು ಸ್ಟ್ರಿಂಗ್ ಎಂದು ತಿಳಿದಿದೆ
console.log("Object is a string:", obj.toUpperCase());
}
}
processObject(new MyClass());
processObject("world");
ಕಸ್ಟಮ್ ಟೈಪ್ ಗಾರ್ಡ್ ಫಂಕ್ಷನ್ಗಳು
ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾದ ಟೈಪ್ ಪರಿಶೀಲನೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಸಂಸ್ಕರಿಸಿದ ಟೈಪ್ ಬಗ್ಗೆ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ತಿಳಿಸಲು ನೀವು ನಿಮ್ಮ ಸ್ವಂತ ಟೈಪ್ ಗಾರ್ಡ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು.
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
interface Bird { fly: () => void; layEggs: () => void; }
interface Fish { swim: () => void; layEggs: () => void; }
function isBird(animal: Bird | Fish): animal is Bird {
return (animal as Bird).fly !== undefined; // ಡಕ್ ಟೈಪಿಂಗ್: ಅದರಲ್ಲಿ 'fly' ಇದ್ದರೆ, ಅದು ಹೆಚ್ಚಾಗಿ Bird
}
function makeSound(animal: Bird | Fish) {
if (isBird(animal)) {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'animal' ಒಂದು Bird ಎಂದು ತಿಳಿದಿದೆ
console.log("Chirp!");
animal.fly();
} else {
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಇಲ್ಲಿ 'animal' ಒಂದು Fish ಎಂದು ತಿಳಿದಿದೆ
console.log("Blub!");
animal.swim();
}
}
const myBird: Bird = { fly: () => console.log("Flying!"), layEggs: () => console.log("Laying eggs!") };
const myFish: Fish = { swim: () => console.log("Swimming!"), layEggs: () => console.log("Laying eggs!") };
makeSound(myBird);
makeSound(myFish);
`isBird` ನಲ್ಲಿ `animal is Bird` ರಿಟರ್ನ್ ಟೈಪ್ ವಿವರಣೆ ನಿರ್ಣಾಯಕವಾಗಿದೆ. ಇದು ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಫಂಕ್ಷನ್ `true` ಅನ್ನು ಹಿಂದಿರುಗಿಸಿದರೆ, `animal` ಪ್ಯಾರಾಮೀಟರ್ ಖಂಡಿತವಾಗಿಯೂ `Bird` ಟೈಪ್ನದ್ದಾಗಿದೆ ಎಂದು ಹೇಳುತ್ತದೆ.
`never` ಟೈಪ್ನೊಂದಿಗೆ ಸಮಗ್ರ ಪರಿಶೀಲನೆ
ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ, ನೀವು ಎಲ್ಲಾ ಸಂಭವನೀಯ ಪ್ರಕರಣಗಳನ್ನು ನಿರ್ವಹಿಸಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವುದು ಸಾಮಾನ್ಯವಾಗಿ ಪ್ರಯೋಜನಕಾರಿಯಾಗಿದೆ. `never` ಟೈಪ್ ಇದಕ್ಕೆ ಸಹಾಯ ಮಾಡಬಹುದು. `never` ಟೈಪ್ *ಎಂದಿಗೂ* ಸಂಭವಿಸದ ಮೌಲ್ಯಗಳನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ. ನೀವು ಒಂದು ನಿರ್ದಿಷ್ಟ ಕೋಡ್ ಪಥವನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಾಗದಿದ್ದರೆ, ನೀವು ವೇರಿಯೇಬಲ್ಗೆ `never` ಅನ್ನು ನಿಯೋಜಿಸಬಹುದು. ಯೂನಿಯನ್ ಟೈಪ್ ಮೇಲೆ ಸ್ವಿಚ್ ಮಾಡುವಾಗ ಸಮಗ್ರತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
type Shape = { kind: "circle", radius: number } | { kind: "square", sideLength: number } | { kind: "triangle", base: number, height: number };
function getArea(shape: Shape): number {
switch (shape.kind) {
case "circle":
return Math.PI * shape.radius * shape.radius;
case "square":
return shape.sideLength * shape.sideLength;
case "triangle":
return 0.5 * shape.base * shape.height;
default:
const _exhaustiveCheck: never = shape; // ಎಲ್ಲಾ ಪ್ರಕರಣಗಳನ್ನು ನಿರ್ವಹಿಸಿದರೆ, 'shape' 'never' ಆಗಿರುತ್ತದೆ
return _exhaustiveCheck; // switch ಸ್ಟೇಟ್ಮೆಂಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡದೆ Shape ಟೈಪ್ಗೆ ಹೊಸ ಆಕಾರವನ್ನು ಸೇರಿಸಿದರೆ ಈ ಸಾಲು ಕಂಪೈಲ್-ಟೈಮ್ ದೋಷವನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ.
}
}
const circle: Shape = { kind: "circle", radius: 5 };
const square: Shape = { kind: "square", sideLength: 10 };
const triangle: Shape = { kind: "triangle", base: 8, height: 6 };
console.log("Circle area:", getArea(circle));
console.log("Square area:", getArea(square));
console.log("Triangle area:", getArea(triangle));
// ನೀವು ಹೊಸ ಆಕಾರವನ್ನು ಸೇರಿಸಿದರೆ, ಉದಾಹರಣೆಗೆ,
// type Shape = { kind: "circle", radius: number } | { kind: "square", sideLength: number } | { kind: "rectangle", width: number, height: number };
// ಕಂಪೈಲರ್ const _exhaustiveCheck: never = shape; ಸಾಲಿನಲ್ಲಿ ದೂರು ನೀಡುತ್ತದೆ ಏಕೆಂದರೆ shape ಆಬ್ಜೆಕ್ಟ್ { kind: "rectangle", width: number, height: number }; ಆಗಿರಬಹುದು ಎಂದು ಕಂಪೈಲರ್ ಅರಿಯುತ್ತದೆ.
// ಇದು ನಿಮ್ಮ ಕೋಡ್ನಲ್ಲಿ ಯೂನಿಯನ್ ಟೈಪ್ನ ಎಲ್ಲಾ ಪ್ರಕರಣಗಳನ್ನು ನಿರ್ವಹಿಸಲು ನಿಮ್ಮನ್ನು ಒತ್ತಾಯಿಸುತ್ತದೆ.
ನೀವು `Shape` ಟೈಪ್ಗೆ ಹೊಸ ಆಕಾರವನ್ನು (`rectangle` ನಂತಹ) `switch` ಸ್ಟೇಟ್ಮೆಂಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡದೆ ಸೇರಿಸಿದರೆ, `default` ಕೇಸ್ ತಲುಪುತ್ತದೆ, ಮತ್ತು ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ದೂರು ನೀಡುತ್ತದೆ ಏಕೆಂದರೆ ಅದು ಹೊಸ ಆಕಾರದ ಟೈಪ್ ಅನ್ನು `never` ಗೆ ನಿಯೋಜಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದು ಸಂಭಾವ್ಯ ದೋಷಗಳನ್ನು ಹಿಡಿಯಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ ಮತ್ತು ನೀವು ಎಲ್ಲಾ ಸಂಭವನೀಯ ಪ್ರಕರಣಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತೀರಿ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳು ಮತ್ತು ಬಳಕೆಯ ಪ್ರಕರಣಗಳು
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿರುವ ಕೆಲವು ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳನ್ನು ಅನ್ವೇಷಿಸೋಣ.
API ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು
API ಪ್ರತಿಕ್ರಿಯೆಗಳು ವಿನಂತಿಯ ಯಶಸ್ಸು ಅಥವಾ ವೈಫಲ್ಯವನ್ನು ಅವಲಂಬಿಸಿ ಸಾಮಾನ್ಯವಾಗಿ ವಿವಿಧ ಸ್ವರೂಪಗಳಲ್ಲಿ ಬರುತ್ತವೆ. ಈ ವಿಭಿನ್ನ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರಕಾರಗಳನ್ನು ಪ್ರತಿನಿಧಿಸಲು ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳನ್ನು ಬಳಸಬಹುದು.
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
type APIResponseSuccess = { status: "success"; data: T };
type APIResponseError = { status: "error"; message: string };
type APIResponse = APIResponseSuccess | APIResponseError;
async function fetchData(url: string): Promise> {
try {
const response = await fetch(url);
const data = await response.json();
if (response.ok) {
return { status: "success", data: data as T };
} else {
return { status: "error", message: data.message || "Unknown error" };
}
} catch (error) {
return { status: "error", message: error.message || "Network error" };
}
}
// ಉದಾಹರಣೆ ಬಳಕೆ
async function getProducts() {
const response = await fetchData("/api/products");
if (response.status === "success") {
const products = response.data;
products.forEach(product => console.log(product.name));
} else {
console.error("Failed to fetch products:", response.message);
}
}
interface Product {
id: number;
name: string;
price: number;
}
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, `APIResponse
ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ ಅನ್ನು ನಿರ್ವಹಿಸುವುದು
ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ಗೆ ಸಾಮಾನ್ಯವಾಗಿ ಮೌಲ್ಯಮಾಪನ ಮತ್ತು ಪಾರ್ಸಿಂಗ್ ಅಗತ್ಯವಿರುತ್ತದೆ. ವಿಭಿನ್ನ ಇನ್ಪುಟ್ ಪ್ರಕಾರಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಡೇಟಾ ಸಮಗ್ರತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಅನ್ನು ಬಳಸಬಹುದು.
// ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್
type ValidEmail = { kind: "valid"; email: string };
type InvalidEmail = { kind: "invalid"; error: string };
type EmailValidationResult = ValidEmail | InvalidEmail;
function validateEmail(email: string): EmailValidationResult {
if (/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(email)) {
return { kind: "valid", email: email };
} else {
return { kind: "invalid", error: "Invalid email format" };
}
}
const emailInput = "test@example.com";
const validationResult = validateEmail(emailInput);
if (validationResult.kind === "valid") {
console.log("Valid email:", validationResult.email);
// ಮಾನ್ಯವಾದ ಇಮೇಲ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಿ
} else {
console.error("Invalid email:", validationResult.error);
// ಬಳಕೆದಾರರಿಗೆ ದೋಷ ಸಂದೇಶವನ್ನು ಪ್ರದರ್ಶಿಸಿ
}
const invalidEmailInput = "testexample";
const invalidValidationResult = validateEmail(invalidEmailInput);
if (invalidValidationResult.kind === "valid") {
console.log("Valid email:", invalidValidationResult.email);
// ಮಾನ್ಯವಾದ ಇಮೇಲ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಿ
} else {
console.error("Invalid email:", invalidValidationResult.error);
// ಬಳಕೆದಾರರಿಗೆ ದೋಷ ಸಂದೇಶವನ್ನು ಪ್ರದರ್ಶಿಸಿ
}
`EmailValidationResult` ಟೈಪ್ ಮಾನ್ಯವಾದ ಇಮೇಲ್ ಅಥವಾ ದೋಷ ಸಂದೇಶದೊಂದಿಗೆ ಅಮಾನ್ಯ ಇಮೇಲ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ. ಇದು ಎರಡೂ ಪ್ರಕರಣಗಳನ್ನು ಸೌಜನ್ಯಯುತವಾಗಿ ನಿರ್ವಹಿಸಲು ಮತ್ತು ಬಳಕೆದಾರರಿಗೆ ಮಾಹಿತಿಪೂರ್ಣ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ನ ಪ್ರಯೋಜನಗಳು
- ಸುಧಾರಿತ ಕೋಡ್ ದೃಢತೆ: ವಿಭಿನ್ನ ಡೇಟಾ ಪ್ರಕಾರಗಳು ಮತ್ತು ಸನ್ನಿವೇಶಗಳನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ನಿರ್ವಹಿಸುವ ಮೂಲಕ, ನೀವು ರನ್ಟೈಮ್ ದೋಷಗಳ ಅಪಾಯವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತೀರಿ.
- ವರ್ಧಿತ ಕೋಡ್ ನಿರ್ವಹಣೆ: ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಬಳಸುವ ಕೋಡ್ ಸಾಮಾನ್ಯವಾಗಿ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು ಸುಲಭವಾಗಿರುತ್ತದೆ ಏಕೆಂದರೆ ಅದು ವಿಭಿನ್ನ ಡೇಟಾ ರಚನೆಗಳನ್ನು ನಿರ್ವಹಿಸುವ ತರ್ಕವನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ವ್ಯಕ್ತಪಡಿಸುತ್ತದೆ.
- ಹೆಚ್ಚಿದ ಕೋಡ್ ನಿರೀಕ್ಷೆ: ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಕಂಪೈಲರ್ ನಿಮ್ಮ ಕೋಡ್ನ ಸರಿಯಾಗಿರುವುದನ್ನು ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದೆಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ, ಇದು ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಹೆಚ್ಚು ನಿರೀಕ್ಷಿತ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಸುತ್ತದೆ.
- ಉತ್ತಮ ಡೆವಲಪರ್ ಅನುಭವ: ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಟೈಪ್ ಸಿಸ್ಟಮ್ ಮೌಲ್ಯಯುತ ಪ್ರತಿಕ್ರಿಯೆ ಮತ್ತು ಸ್ವಯಂಪೂರ್ಣತೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ, ಇದು ಅಭಿವೃದ್ಧಿಯನ್ನು ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿ ಮತ್ತು ಕಡಿಮೆ ದೋಷ-ಪೀಡಿತವಾಗಿಸುತ್ತದೆ.
ಸವಾಲುಗಳು ಮತ್ತು ಪರಿಗಣನೆಗಳು
- ಸಂಕೀರ್ಣತೆ: ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದು ಕೆಲವೊಮ್ಮೆ ನಿಮ್ಮ ಕೋಡ್ಗೆ ಸಂಕೀರ್ಣತೆಯನ್ನು ಸೇರಿಸಬಹುದು, ವಿಶೇಷವಾಗಿ ಸಂಕೀರ್ಣ ಡೇಟಾ ರಚನೆಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ.
- ಕಲಿಕೆಯ ರೇಖೆ: ಫಂಕ್ಷನಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಪರಿಕಲ್ಪನೆಗಳೊಂದಿಗೆ ಪರಿಚಯವಿಲ್ಲದ ಡೆವಲಪರ್ಗಳು ಈ ತಂತ್ರಗಳನ್ನು ಕಲಿಯಲು ಸಮಯವನ್ನು ಹೂಡಿಕೆ ಮಾಡಬೇಕಾಗಬಹುದು.
- ರನ್ಟೈಮ್ ಓವರ್ಹೆಡ್: ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಪ್ರಾಥಮಿಕವಾಗಿ ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ನಡೆದರೂ, ಕೆಲವು ತಂತ್ರಗಳು ಕನಿಷ್ಠ ರನ್ಟೈಮ್ ಓವರ್ಹೆಡ್ ಅನ್ನು ಪರಿಚಯಿಸಬಹುದು.
ಪರ್ಯಾಯಗಳು ಮತ್ತು ವಿನಿಮಯಗಳು
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಶಕ್ತಿಯುತ ತಂತ್ರಗಳಾಗಿದ್ದರೂ, ಅವು ಯಾವಾಗಲೂ ಅತ್ಯುತ್ತಮ ಪರಿಹಾರವಲ್ಲ. ಪರಿಗಣಿಸಬೇಕಾದ ಇತರ ವಿಧಾನಗಳು ಸೇರಿವೆ:
- ಆಬ್ಜೆಕ್ಟ್-ಓರಿಯೆಂಟೆಡ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ (OOP): OOP ಪಾಲಿಮಾರ್ಫಿಸಂ ಮತ್ತು ಅಬ್ಸ್ಟ್ರ್ಯಾಕ್ಷನ್ಗಾಗಿ ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ ಅದು ಕೆಲವೊಮ್ಮೆ ಇದೇ ರೀತಿಯ ಫಲಿತಾಂಶಗಳನ್ನು ಸಾಧಿಸಬಹುದು. ಆದಾಗ್ಯೂ, OOP ಸಾಮಾನ್ಯವಾಗಿ ಹೆಚ್ಚು ಸಂಕೀರ್ಣ ಕೋಡ್ ರಚನೆಗಳು ಮತ್ತು ಇನ್ಹೆರಿಟೆನ್ಸ್ ಶ್ರೇಣಿಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು.
- ಡಕ್ ಟೈಪಿಂಗ್: ಡಕ್ ಟೈಪಿಂಗ್ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅಗತ್ಯ ಪ್ರಾಪರ್ಟಿಗಳು ಅಥವಾ ವಿಧಾನಗಳನ್ನು ಹೊಂದಿದೆಯೇ ಎಂದು ನಿರ್ಧರಿಸಲು ರನ್ಟೈಮ್ ಪರಿಶೀಲನೆಗಳ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದೆ. ಹೊಂದಿಕೊಳ್ಳುವಂತಿದ್ದರೂ, ನಿರೀಕ್ಷಿತ ಪ್ರಾಪರ್ಟಿಗಳು ಕಾಣೆಯಾಗಿದ್ದರೆ ಇದು ರನ್ಟೈಮ್ ದೋಷಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು.
- ಯೂನಿಯನ್ ಟೈಪ್ಗಳು (ಡಿಸ್ಕ್ರಿಮಿನೆಂಟ್ಗಳಿಲ್ಲದೆ): ಯೂನಿಯನ್ ಟೈಪ್ಗಳು ಉಪಯುಕ್ತವಾಗಿದ್ದರೂ, ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಅನ್ನು ಹೆಚ್ಚು ದೃಢವಾಗಿಸುವ ಸ್ಪಷ್ಟ ಡಿಸ್ಕ್ರಿಮಿನೆಂಟ್ ಪ್ರಾಪರ್ಟಿಯ ಕೊರತೆ ಅವುಗಳಲ್ಲಿರುತ್ತದೆ.
ನಿಮ್ಮ ಯೋಜನೆಯ ನಿರ್ದಿಷ್ಟ ಅವಶ್ಯಕತೆಗಳು ಮತ್ತು ನೀವು ಕೆಲಸ ಮಾಡುತ್ತಿರುವ ಡೇಟಾ ರಚನೆಗಳ ಸಂಕೀರ್ಣತೆಯನ್ನು ಅವಲಂಬಿಸಿ ಅತ್ಯುತ್ತಮ ವಿಧಾನವು ನಿರ್ಧರಿಸಲ್ಪಡುತ್ತದೆ.
ಜಾಗತಿಕ ಪರಿಗಣನೆಗಳು
ಅಂತರರಾಷ್ಟ್ರೀಯ ಪ್ರೇಕ್ಷಕರೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ, ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಪರಿಗಣಿಸಿ:
- ಡೇಟಾ ಸ್ಥಳೀಕರಣ: ದೋಷ ಸಂದೇಶಗಳು ಮತ್ತು ಬಳಕೆದಾರರಿಗೆ ಕಾಣುವ ಪಠ್ಯವನ್ನು ವಿವಿಧ ಭಾಷೆಗಳು ಮತ್ತು ಪ್ರದೇಶಗಳಿಗಾಗಿ ಸ್ಥಳೀಕರಿಸಲಾಗಿದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.
- ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಸ್ವರೂಪಗಳು: ಬಳಕೆದಾರರ ಲೊಕೇಲ್ಗೆ ಅನುಗುಣವಾಗಿ ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಸ್ವರೂಪಗಳನ್ನು ನಿರ್ವಹಿಸಿ.
- ಕರೆನ್ಸಿ: ಬಳಕೆದಾರರ ಲೊಕೇಲ್ಗೆ ಅನುಗುಣವಾಗಿ ಕರೆನ್ಸಿ ಚಿಹ್ನೆಗಳು ಮತ್ತು ಮೌಲ್ಯಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ.
- ಅಕ್ಷರ ಎನ್ಕೋಡಿಂಗ್: ವಿವಿಧ ಭಾಷೆಗಳಿಂದ ವ್ಯಾಪಕ ಶ್ರೇಣಿಯ ಅಕ್ಷರಗಳನ್ನು ಬೆಂಬಲಿಸಲು UTF-8 ಎನ್ಕೋಡಿಂಗ್ ಬಳಸಿ.
ಉದಾಹರಣೆಗೆ, ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ ಅನ್ನು ಮೌಲ್ಯಮಾಪನ ಮಾಡುವಾಗ, ನಿಮ್ಮ ಮೌಲ್ಯಮಾಪನ ನಿಯಮಗಳು ವಿವಿಧ ದೇಶಗಳಲ್ಲಿ ಬಳಸಲಾಗುವ ವಿಭಿನ್ನ ಅಕ್ಷರ ಸೆಟ್ಗಳು ಮತ್ತು ಇನ್ಪುಟ್ ಸ್ವರೂಪಗಳಿಗೆ ಸೂಕ್ತವಾಗಿವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.
ತೀರ್ಮಾನ
ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ಮತ್ತು ಟೈಪ್ ನ್ಯಾರೋಯಿಂಗ್ ಹೆಚ್ಚು ದೃಢವಾದ, ನಿರ್ವಹಿಸಬಲ್ಲ, ಮತ್ತು ನಿರೀಕ್ಷಿತ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕೋಡ್ ಬರೆಯಲು ಶಕ್ತಿಯುತ ತಂತ್ರಗಳಾಗಿವೆ. ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳು, ಟೈಪ್ ಗಾರ್ಡ್ ಫಂಕ್ಷನ್ಗಳು, ಮತ್ತು ಇತರ ಸುಧಾರಿತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಮೂಲಕ, ನೀವು ನಿಮ್ಮ ಕೋಡ್ನ ಗುಣಮಟ್ಟವನ್ನು ಹೆಚ್ಚಿಸಬಹುದು ಮತ್ತು ರನ್ಟೈಮ್ ದೋಷಗಳ ಅಪಾಯವನ್ನು ಕಡಿಮೆ ಮಾಡಬಹುದು. ಈ ತಂತ್ರಗಳಿಗೆ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಟೈಪ್ ಸಿಸ್ಟಮ್ ಮತ್ತು ಫಂಕ್ಷನಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಪರಿಕಲ್ಪನೆಗಳ ಬಗ್ಗೆ ಆಳವಾದ ತಿಳುವಳಿಕೆ ಅಗತ್ಯವಿದ್ದರೂ, ಪ್ರಯೋಜನಗಳು ಪ್ರಯತ್ನಕ್ಕೆ ಯೋಗ್ಯವಾಗಿವೆ, ವಿಶೇಷವಾಗಿ ಹೆಚ್ಚಿನ ಮಟ್ಟದ ವಿಶ್ವಾಸಾರ್ಹತೆ ಮತ್ತು ನಿರ್ವಹಣೆಯನ್ನು ಬಯಸುವ ಸಂಕೀರ್ಣ ಯೋಜನೆಗಳಿಗೆ. ಸ್ಥಳೀಕರಣ ಮತ್ತು ಡೇಟಾ ಫಾರ್ಮ್ಯಾಟಿಂಗ್ನಂತಹ ಜಾಗತಿಕ ಅಂಶಗಳನ್ನು ಪರಿಗಣಿಸುವ ಮೂಲಕ, ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು ವೈವಿಧ್ಯಮಯ ಬಳಕೆದಾರರಿಗೆ ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಸೇವೆ ಸಲ್ಲಿಸಬಹುದು.